package com.zhj.rabbitmq.demo;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @program: rabbimmq-demo
 * @description: 发送消息
 * @author: zhengjibin
 * @create: 2020-11-16 10:53
 * @Version 1.0
 **/
public class SendMessage {
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂，工厂方法。这的connection 可以直接对应rabbitmq中的一个组件connection
        //rabbitmq的通道（channel）就是在connection中的
        ConnectionFactory factory = new ConnectionFactory();
        //配置rabbitmq的链接信息
        factory.setHost("122.112.198.94");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        Connection connection = null;// 定义rabbitmq的网络连接 ，一个连接
        Channel channel = null;//定义一个链接中的通道
        connection = factory.newConnection();//通过工厂获得连接
        channel = connection.createChannel();//通过连接获得通道
        /*
            生成一个队列，queueDeclare()方法有很多的重载方法，具体使用，参考源码
             channel.queueDeclare();//方法 5个参数说明
            参数1：队列名称自定义
            参数2：是否为持久化的队列
            参数3：是否排外是排外的话就只能一个客户端监听
            参数4：是否是自动删除设置了true表示自动删除队列没有数据没有客户端连接时删除
            参数5:队列的一些属性设置一般设置为null

            注意：声明队列时，如果rabbitmq中 队列名称有就直接使用，没有就创建队列

            //channel.queueDeclare(queueName,true,false,false,null); // 这行代码可以不存在
            如果这个队列名称已经在rabbitmq中有就不用 这一句了
         */
        String queueName = "demo1_queue";
        channel.queueDeclare(queueName,true,false,false,null);//生成消息队列,如果 rabbitmq中已经有queueName 队列了，那么可以不用这一句代码。也可以在管控台中创建
                                                                            //生成消息队列 。可以在消费端创建队列，也能在生产端创建队列。
        String message = "第二个消息21";
        //发送消息
        /*
            参数1：交换机名称，空字符串表示不使用交换机
            参数2：表示队列名或routingkey，当指定了交换机名称后，这个值就是routingkey。没有指定交换机就表示队列名称
            参数3：参数属性，一般为空
            参数4：消息内容的字节数组
         */
        channel.basicPublish("",queueName,null,message.getBytes("UTF-8"));
        System.out.println("消息发送成功");

        channel.close();
        connection.close();
    }
}
